import importlib
import pkgutil
import os


def get_all_modules(path, file_name, have_path=None):
    """
    获取路径下的所有file_name的module
    """
    # 获取目录的配置(目录必须是一个包，才会有__path__属性)
    _app = importlib.import_module(path)

    def get_all_moudules_name(package_path, prefix=""):
        # 用于深度遍历文件夹
        for loader, name, is_package in pkgutil.iter_modules([package_path]):
            if is_package:
                # 如果还是一个包，那么再次遍历，且遍历的时候加上前缀
                for _name in get_all_moudules_name(os.path.join(package_path, name), prefix=f"{name}."):
                    yield prefix + _name
            else:
                yield prefix + name

    if have_path :
        result = []
        for module_name in get_all_moudules_name(_app.__path__[0]):
            # 以相应的名称开头的
            if module_name.split(".")[-1][:len(file_name)] == file_name:
                _module = importlib.import_module(f"{path}.{module_name}")
                result.append((_module,f"{path}.{module_name}"))
        return result

    else:
        return [
            importlib.import_module(f"{path}.{module_name}")
            for module_name in get_all_moudules_name(_app.__path__[0])
            if module_name.split(".")[-1][:len(file_name)] == file_name
        ]


def dynamic_import(path):
    _service = path.split(".")
    # 引入路径中的所有的module
    _lib = importlib.import_module(".".join(_service[0:-1]))
    # 获取到module
    return _lib.getattr(_lib, _service[-1])
